<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>C语言基础 - 数组</title>
    <link rel="stylesheet" href="common.css">
    <style>
        /* 页面特有样式 */
        .array-card {
            background-color: #f5f9ff;
            border-radius: 8px;
            padding: 20px;
            margin-bottom: 25px;
            border-left: 4px solid #5D9CEC;
        }
        
        .initialization-box {
            background-color: #f0f7ff;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .traversal-box {
            background-color: #fff3e0;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .parameter-box {
            background-color: #e8f5e9;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .warning-note {
            background-color: #ffebee;
            border-left: 4px solid #f44336;
            padding: 12px;
            margin: 15px 0;
        }
        
        .best-practice {
            background-color: #e3f2fd;
            padding: 12px;
            border-left: 4px solid #2196F3;
            margin: 15px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>C语言基础入门课程</h1>
        </header>
        
        <nav>
            <a href="index.html">首页</a>
            <a href="02-intro.html">C语言简介与环境搭建</a>
            <a href="03-structure.html" class="current">C程序结构</a>
            <a href="04-datatypes.html">基本数据类型</a>
            <a href="05-variables.html">变量与常量</a>
            <a href="06-operators.html">运算符</a>
            <a href="07-io.html" class="current">输入输出</a>
            <a href="08-conditionals.html">条件语句</a>
            <a href="09-loops.html">循环结构</a>
            <a href="10-functions.html" class="current">函数基础</a>
            <a href="11-scope.html">作用域与存储类</a>
            <a href="12-recursion.html">递归函数</a>
            <a href="13-arrays.html">一维数组</a>
            <a href="14-multidim.html" class="current">多维数组</a>
            <a href="15-strings.html">字符串处理</a>
            <a href="16-pointers.html">指针基础</a>
            <a href="17-pointers_advanced.html" class="current">指针进阶</a>
            <a href="18-structs.html">结构体</a>
            <a href="19-files.html">文件操作</a>
            <a href="20-project.html">综合项目</a>
        </nav>
        
        <main>
            <h2>C语言一维数组</h2>
            
            <section>
                <h3>数组概述</h3>
                <p>数组是相同类型元素的集合，通过下标访问各个元素。</p>
            </section>
            
            <div class="array-card">
                <h3>1. 数组声明与初始化</h3>
                
                <div class="initialization-box">
                    <h4>数组声明语法</h4>
                    <pre><code>数据类型 数组名[数组大小];</code></pre>
                    
                    <h4>初始化方式</h4>
                    <pre><code>// 方式1: 声明时初始化
int numbers[5] = {1, 2, 3, 4, 5};

// 方式2: 不指定大小(编译器自动计算)
int primes[] = {2, 3, 5, 7, 11};

// 方式3: 部分初始化(剩余元素自动初始化为0)
int data[10] = {1, 2, 3};  // 后7个元素为0

// 方式4: 指定元素初始化(C99特性)
int arr[10] = {[3] = 100, [7] = 200};</code></pre>
                </div>
                
                <div class="warning-note">
                    <h4>注意事项</h4>
                    <ul>
                        <li>数组大小必须是常量表达式</li>
                        <li>数组下标从0开始</li>
                        <li>访问越界是未定义行为</li>
                        <li>数组名表示数组首元素的地址</li>
                    </ul>
                </div>
            </div>
            
            <div class="array-card">
                <h3>2. 数组遍历</h3>
                
                <div class="traversal-box">
                    <h4>使用for循环遍历</h4>
                    <pre><code>int scores[5] = {85, 90, 78, 92, 88};
int sum = 0;

// 正向遍历
for (int i = 0; i < 5; i++) {
    printf("元素%d: %d\n", i, scores[i]);
    sum += scores[i];
}

// 反向遍历
for (int i = 4; i >= 0; i--) {
    printf("元素%d: %d\n", i, scores[i]);
}</code></pre>
                    
                    <h4>使用while循环遍历</h4>
                    <pre><code>int i = 0;
while (i < 5) {
    printf("%d ", scores[i]);
    i++;
}</code></pre>
                </div>
                
                <div class="best-practice">
                    <h4>遍历技巧</h4>
                    <ul>
                        <li>使用sizeof计算数组长度：<code>int len = sizeof(arr)/sizeof(arr[0]);</code></li>
                        <li>避免硬编码数组大小</li>
                        <li>考虑使用宏定义数组大小</li>
                    </ul>
                </div>
            </div>
            
            <div class="array-card">
                <h3>3. 数组作为参数</h3>
                
                <div class="parameter-box">
                    <h4>传递数组给函数</h4>
                    <pre><code>// 函数原型
void printArray(int arr[], int size);
// 或
void printArray(int *arr, int size);

// 函数定义
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
}

// 函数调用
int main() {
    int nums[] = {1, 2, 3, 4, 5};
    printArray(nums, 5);
    return 0;
}</code></pre>
                </div>
                
                <div class="warning-note">
                    <h4>重要特性</h4>
                    <ul>
                        <li>数组作为参数时退化为指针</li>
                        <li>函数内无法通过sizeof获取数组长度</li>
                        <li>数组参数是引用传递(会修改原数组)</li>
                        <li>可以添加const防止修改：<code>void func(const int arr[])</code></li>
                    </ul>
                </div>
                
                <div class="parameter-box">
                    <h4>返回数组的函数</h4>
                    <p>C语言不能直接返回数组，但可以返回指针：</p>
                    <pre><code>// 返回动态分配的数组
int* createArray(int size) {
    int *arr = (int*)malloc(size * sizeof(int));
    for (int i = 0; i < size; i++) {
        arr[i] = i * 10;
    }
    return arr;
}

// 调用示例
int *myArray = createArray(5);
// 使用后必须释放
free(myArray);</code></pre>
                </div>
            </div>
            
            <section>
                <h3>综合示例</h3>
                <pre><code>#include &lt;stdio.h&gt;

// 计算数组平均值
double getAverage(const int arr[], int size) {
    double sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum / size;
}

// 修改数组元素
void multiplyByTwo(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2;
    }
}

int main() {
    int numbers[] = {10, 20, 30, 40, 50};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    printf("原始数组: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", numbers[i]);
    }
    
    printf("\n平均值: %.2f", getAverage(numbers, size));
    
    multiplyByTwo(numbers, size);
    printf("\n修改后数组: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", numbers[i]);
    }
    
    return 0;
}</code></pre>
            </section>
        </main>
        
        <footer>
             <p>&copy; </p>
        </footer>
        
        <!-- 二维码区域 -->

    </div> <!-- 结束.container -->
</body>
</html>